package client.construct.abstract_factory;

import org.junit.Test;
import org.xml.sax.SAXException;
import uml.construct.abstract_factory.Button;
import uml.construct.abstract_factory.ComboBox;
import uml.construct.abstract_factory.SkinFactory;
import uml.construct.abstract_factory.TextFiled;
import util.bean.BeanUtil;
import util.xml.XMLUtil;

import javax.xml.parsers.ParserConfigurationException;
import java.io.File;
import java.io.IOException;

/**
 * 抽象工厂--客户端<br>
 * 优点：<br>
 * 1.增加新的产品族很方便,无需修改已有系统<br>
 * 2.当一个产品族中的多个对象被设计为一起工作时，此模式能够保证客户端始终只使用同一个产品族的对象<br>
 * 3.只需要改变工厂实例就可以改变系统一系列相关的行为<br>
 * 缺点：增加新的产品等级结构麻烦，需要对原有系统进行较大修改，甚至对抽象层代码进行修改，显然违背了开闭原则<br>
 * on 2022/12/17 1:23
 */
public class Client {
    @Test
    public void t() throws ParserConfigurationException, IOException, ClassNotFoundException, InstantiationException, IllegalAccessException, SAXException {
        SkinFactory skinFactory = BeanUtil.newBean(
                SkinFactory.class,
                new File("src/main/resources/xml/abstract_factory.xml"),
                "factoryFullName");
        TextFiled textField = skinFactory.createTextField();
        Button button = skinFactory.createButton();
        ComboBox comboBox = skinFactory.createComboBox();
        textField.display();
        button.display();
        comboBox.display();
    }
}
